package com.cg.offer;

import org.junit.Test;

import java.util.HashMap;
import java.util.HashSet;

/**
 * 剑指Offer 50.第一个只出现一次的字符
 *
 * @program: LeetCode->Offer_50
 * @description: 剑指Offer 50.第一个只出现一次的字符
 * @author: cg
 * @create: 2022-03-13 22:44
 **/
public class Offer_50 {

    @Test
    public void test40() {
        System.out.println(firstUniqChar("leetcode"));
        System.out.println(firstUniqChar("abaccdeff"));
        System.out.println(firstUniqChar(""));
    }

    /**
     * 在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
     * <p>
     * 示例 1:
     * 输入：s = "abaccdeff"
     * 输出：'b'
     * <p>
     * 示例 2:
     * 输入：s = ""
     * 输出：' '
     * <p>
     * 限制：
     * 0 <= s 的长度 <= 50000
     *
     * @param s
     * @return
     */
    public char firstUniqChar(String s) {
        if (s.equals("")) {
            return ' ';
        }
        //创建‘a'-'z'的字典
        int[] target = new int[26];
        //第一次遍历，将字符统计到字典数组
        for (int i = 0; i < s.length(); i++) {
            target[s.charAt(i) - 'a']++;
        }
        //第二次遍历，从字典数组获取次数
        for (int i = 0; i < s.length(); i++) {
            if (target[s.charAt(i) - 'a'] == 1) {
                return s.charAt(i);
            }
        }
        return ' ';
        /*HashMap<Character, Integer> map = new HashMap<>();
        for (char ch : s.toCharArray()) {
            if (map.containsKey(ch)) {
                map.put(ch, map.get(ch) + 1);
            } else {
                map.put(ch, 1);
            }
        }
        for (char ch : s.toCharArray()) {
            if (map.get(ch) == 1) {
                return ch;
            }
        }
        return ' ';*/
    }

}
